import java.sql.Connection;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
/*
* 构造 CountDownLatch 实例, 初始化 10 表示有 10 个任务需要完成.
  每个任务执行完毕, 都调用 latch.countDown()   . 在 CountDownLatch 内部的计数器同时自减.
 主线程中使用 latch.await(); 阻塞等待所有任务执行完毕. 相当于计数器为 0 了.*/
public class ThreafDemo19 {
    public static void main(String[] args) throws InterruptedException {
        //此构造方法中的10，表示有10个线程、任务
        CountDownLatch countDownLatch =new CountDownLatch(10);
        Random random =new Random();
        //创建出十个线程负责下载
        for(int i=0;i<10;i++){
            int id=i;
            Thread t1 = new Thread(() ->{
                //【0，10）左闭右开 从0️到9️
                int n = random.nextInt(10);
                System.out.println("线程 "+id+" 开始下载");
                try {
                    //sleep休眠1s在执行
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("线程 "+id+" 结束下载");
                //2.告知countDownLatch，当前线程执行完成
                countDownLatch.countDown();

            });
            //线程启动
            t1.start();
        }
        //3.通过await等待所有任务结束，来告诉countDownLatch被调用了十次
        //表示阻塞等待需要等到十个线程全部结束，再返回
        countDownLatch.await();
        System.out.println("所有的任务已经完成");

    }
}
